Strana 1 z 1

Int -> Bit shifting

Napísané: 25 Okt 2022, 19:40
od používateľa bibibo
Ahojte,
potreboval by som trochu pomoct s nasledujucim problemom. Pouzivam zatial v testovacej prevadzke HomeAssistant. Mam tam nejake senzory prostredia a tepelne cerpadlo. S tepelnym cerpadlo komunikujem cez Modbus TCP. Problem je, ze to tepelne cerpadlo resp. modbus ma registre napr. Fault Flag alebo Status Flag a kazdy z tychto registrov ma 8 bitov. Modbus mi vsak vrati cislo v desiatkovej sustave, takze neviem sledovat kazdy bit.
Napr.:
Bit0 - Kompresor ON/OFF
Bit1 - Fan ON/OF
atd.

Na tomto linku https://community.home-assistant.io/t/4 ... al/54657/8 uzivatel pnbruckner vysvetluje ako je to mozne urobit, ale vobec tomu nerozumiem. Pomoze niekto ?

Re: Int -> Bit shifting

Napísané: 25 Okt 2022, 19:59
od používateľa Atlan
Zoberies register s danym cislom a otestujes bit0 vysledok 1 alebo 0 zapises do registra kompresor.
Prevedies posun v pravo a znova otestujes bit0 vysledok zapises do registra fan.

Re: Int -> Bit shifting

Napísané: 25 Okt 2022, 20:06
od používateľa miso156
Povedzme ze v registri je hodnota 0000 1100 co je v dekadickom tvare 12 a ty chces ziskat hodnotu druheho bitu (treti z prava, lebo bity sa pocitaju o nuly).

Takze najskor posunies odsah registru 2 krat do prava tym, ze register podelis 4.
(2 na druhu)
(keby si chcel treti bit, delis 8-ickou, teda 2 na tretiu)
(delenie je //)

Po tomto ukone je v registri cislo 0000 0011 co je 3.

Teraz podelis (celociselne) obsah registru 2-kou a zvysok po deleni je tvoj vysledok. To vsetko zabezpeci funkcia mudulo (%). A teda 3 / 2 je 1 a zvysok je 1. Tym si uspesne ziskal hodnotu druheho bitu.

Re: Int -> Bit shifting

Napísané: 25 Okt 2022, 21:05
od používateľa bibibo
Super. Diky moc. Uz mi to je jasnejsie.

Re: Int -> Bit shifting

Napísané: 25 Okt 2022, 21:56
od používateľa Mek
Da sa to aj jednoduchsie.
Napriklad, cely bajt je 00101000 a je v premennej "a"
a ty chces vytiahnut tu druhu jednotku (4. bit sprava)

Kód: Vybrať všetko

if (a & 0b00001000)
{
...
}

Re: Int -> Bit shifting

Napísané: 29 Okt 2022, 11:39
od používateľa bibibo
Diky, pani. trochu som sa k niecomu priucil.
Nakoniec som sa docital, ze HomeAssistant pouziva pre Teplate nejaky jazyk Jinja a urobil som to takto:

Kód: Vybrať všetko

{% if states('sensor.compresor')|int|bitwise_and(1) > 0 %}