Запуск команд GPIO из словаря - PullRequest
1 голос
/ 12 января 2020

Я публикую / подписываюсь на / от сообщений между Raspberry Pi и удаленным веб-сервером. Когда я отправляю сообщения на пи с помощью mqtt, я посылаю строку с именем канала на пи, которую я хочу запустить. У меня есть переменные в сценарии с именем pump1, pump2, et c ..., которые имеют соответствующие каналы RPi. У меня есть словарь, ключи которого - это каналы RPi, которые я хочу включить, и значения - это команды GPIO для этого. Сообщения mqtt должны соответствовать ключам словаря. Если ключи совпадают, я хочу запустить значение, связанное с этим ключом.

Ниже мой словарь. Когда я получаю доступ к словарю, я получаю None для значений, если я не заключаю их в кавычки. Когда я использую в качестве строк вокруг команд GPIO, я не могу запустить команду. У кого-нибудь есть идея запустить эти команды?

Я также пытался запустить что-то вроде этого. Этот метод не работает, потому что pump1 не является целым числом, обозначающим, какой канал включить pi, но у меня есть переменные с именами pump1, pump2, et c .., связанные с каналами RPi, поэтому я подумал, что это может работать, но python все еще вижу это строка.

mqtt.message = ['pump1','on']
GPIO.output(mqtt.message[0], False)

Словарь:

pumps = {
    "pump1:on": GPIO.output(pump1,False),
    "pump1:off": GPIO.output(pump1,True),
    "pump2:on": GPIO.output(pump2,False),
    "pump2:off": GPIO.output(pump2,True),
    "pump3:on": GPIO.output(pump3,False),
    "pump3:off": GPIO.output(pump3,True),
    "waterpump:on": GPIO.output(waterpump,False),
    "waterpump:off": GPIO.output(waterpump,True),
}

1 Ответ

2 голосов
/ 12 января 2020

То, как вы его указали в настоящее время, будет вызывать функции во время создания словаря pumps. Вместо этого вы хотите сохранить словарь ключей для функций, которые затем можно вызывать при желании. Мы можем использовать lambda s для этого. Вот упрощенный пример:

funcs = {
    'print_int': lambda: print(1),
    'print_string': lambda: print("one"),
    'print_list': lambda: print([]),
}

Затем вы можете вызвать его, проиндексировав с помощью ключа и вызвав функцию следующим образом:

>>> funcs['print_int']()
1
>>> funcs['print_string']()
one
>>> funcs['print_list']()
[]

Вы также можете иметь функции, которые принимают аргументы следующим образом :

funcs = {
    'print_num': lambda num: print(num),
}

>>> funcs['print_num'](123)
123

В вашем случае использования аргументов это может выглядеть как

pumps = {
    "pump1": lambda state: GPIO.output(pump1, not state),
}

pumps['pump1'](True)  # to turn pump on

или, если вы не хотите использовать аргументы, просто:

pumps = {
    "pump1:on":  lambda: GPIO.output(pump1, False),
    "pump1:off": lambda: GPIO.output(pump1, True),
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...